"""
常用的类型提示
"""

# flake8: noqa

from datetime import (
    date,
    datetime,
    time,
    timedelta,
    timezone,
)
from decimal import Decimal
from io import BytesIO
from pathlib import Path
from typing import (
    Any,
    AsyncGenerator,
    Awaitable,
    Callable,
    ClassVar,
    Coroutine,
    Final,
    _GenericAlias as GenericAlias,  # noqa: ignore attribute
    FrozenSet,
    Generator,
    Iterable,
    Iterator,
    Literal,
    Mapping,
    NamedTuple,
    OrderedDict,
    overload,
    Sequence,
    TypedDict,
    TypeVar,
    final,
)

CallableNone = Callable[..., None]
""" 可调用对象 | 参数是任意类型，返回值都是 None """

CallableAny = Callable[..., Any]
""" 可调用对象 | 参数和返回值都是任意类型 """

DictIntStr = dict[int, str]
""" 字典 | 键是数字，值是字符串 """

DictIntInt = dict[int, int]
""" 字典 | 键是数字，值是数字 """

DictStrInt = dict[str, int]
""" 字典 | 键是字符串，值是数字 """

DictStrStr = dict[str, str]
""" 字典 | 键值都是字符串 """

DictStrAny = dict[str, Any]
""" 字典 | 键是字符串，值是任意类型 """

ListStr = list[str]
""" 列表 | 元素都是字符串 """

ListInt = list[int]
""" 列表 | 元素都是数字 """

ListDict = list[dict]
""" 列表 | 元素都是字典 """

ListType = list[type]
""" 列表 | 元素都是类型 """

ListBytes = list[bytes]
""" 列表 | 元素都是字节 """

SetStr = set[str]
""" 集合 | 元素都是字符串 """

SetInt = set[int]
""" 集合 | 元素都是数字 """

TupleStr = tuple[str, ...]
""" 元组 | 元素都是字符串 """

TupleInt = tuple[int, ...]
""" 元组 | 元素都是数字 """

TupleDict = tuple[dict, ...]
""" 元组 | 元素都是字典 """

TupleType = tuple[type, ...]
""" 元组 | 元素都是类型 """

StrOrNone = str | None
""" 字符串 或 None """

IntOrNone = int | None
""" 数字 或 None """

IntOrStr = int | str
""" 数字 或 字符串 """

FloatOrNone = float | None
""" 浮点数 或 None """

BoolOrNone = bool | None
""" 布尔值 或 None """

AnyOrNone = Any | None
""" 任意类型 或 None """

DictOrNone = dict | None
""" 字典 或 None """

ListOrNone = list | None
""" 列表 或 None """

SetOrNone = set | None
""" 集合 或 None """

TupleOrNone = tuple | None
""" 元组 或 None """

DateTimeOrNone = datetime | None
""" 日期时间 或 None """

DateOrNone = date | None
""" 日期 或 None """

TimeOrNone = time | None
""" 时间 或 None """

DateTimeOrStr = datetime | str
""" 日期时间 或 字符串 """

DateOrStr = date | str
""" 日期 或 字符串 """

TimeOrStr = time | str
""" 时间 或 字符串 """

DatetimeRelatedType = datetime | date | time
""" 日期时间/日期/时间 """

StrOrBytesIO = str | BytesIO
""" 字符串 或 BytesIO """

NumberType = Decimal | float | int
""" 数字类型 | Decimal, float, int """

PathOrStr = Path | str
""" 路径 或 字符串 """